<?php
/**
 * @version 1.0 对象存储相关逻辑类
 * @internal
 * @link
 * @property
 * @see
 * @since
 * @uses
 *
 */

namespace app\user\logic;

vendor('aliyun-oss.autoload');

use app\Api;
use OSS\OssClient;
use OSS\Core\OssException;


class Oss extends Api
{
    private static $obj = null;

    private $__OssClient;

    private $__config;

    public function __construct()
    {
        parent::__construct();
        $this->__config = config('oss');
        $this->__OssClient = new OssClient($this->__config['key_id'], $this->__config['key_secret'], $this->__config['endpoint']);
        $this->__OssClient->setTimeout(3600); //设置请求超时时间seconds
        $this->__OssClient->setConnectTimeout(10);//设置连接超时时间seconds
    }

    /**
     * 类入口
     * @return Oss|null
     */
    public static function getInstance()
    {
        if (is_null(self::$obj))
            self::$obj = new self();
        return self::$obj;
    }

    /**
     * 文件上传
     * @param $object string  图片保存的路径
     * @param $filePath string 图片缓存的路径
     * @return bool
     */
    public function uploadFile($object, $filePath)
    {
        try {
            $this->__OssClient->uploadFile($this->__config['bucket'], $object, (string)$filePath);
        } catch (OssException $e) {
            print($e->getMessage());
        }
        return true;
    }

    /**
     * 图片缩放
     * @param $imgPath string 图片路径
     * @param string $thumbType string 图片缩放类型
     * @param string $type string 图片缩放类型（- lfit：等比缩放，限制在设定在指定w与h的矩形内的最大图片。- mfit：等比缩放，延伸出指定w与h的矩形框外的最小图片。- fill：固定宽高，将延伸出指定w与h的矩形框外的最小图片进行居中裁剪。- pad：固定宽高，缩略填充。- fixed：固定宽高，强制缩略）
     * @param string $height string 指定目标缩略图的高度（1-4096）
     * @param string $width string 指定目标缩略图的宽度 （1-4096）
     * @param string $limit string 指定当目标缩略图大于原图时是否处理。值是 1 表示不处理；值是 0 表示处理。
     * @param string $color string 缩放模式选择为pad（缩略填充）时，可以选择填充的颜色(默认是白色)参数的填写方式：采用16进制颜色码表示，如00FF00（绿色）
     * @return mixed
     */
    public function thumbImg($imgPath, $type = 'lfit', $height = 100, $width = 100, $color = 'FFFFFF')
    {
        $imgNewPath = $imgPath;
        switch ($type) {
            case 'lfit' : //lfit：等比缩放，限制在设定在指定w与h的矩形内的最大图片。
                $imgNewPath .= '?x-oss-process=image/resize,m_lfit,h_' . $height . ',w_' . $width;
                break;
            case 'mfit' : //mfit：等比缩放，延伸出指定w与h的矩形框外的最小图片。
                $imgNewPath .= '?x-oss-process=image/resize,m_mfit,h_' . $height . ',w_' . $width;
                break;
            case 'fill' : //fill：固定宽高，将延伸出指定w与h的矩形框外的最小图片进行居中裁剪
                $imgNewPath .= '?x-oss-process=image/resize,m_fill,h_' . $height . ',w_' . $width;
                break;
            case 'pad' : //pad：固定宽高，缩略填充。
                $imgNewPath .= '?x-oss-process=image/resize,m_pad,h_' . $height . ',w_' . $width . ',color_' . $color;
                break;
            case 'fixed' : //fixed：固定宽高，强制缩略）
                $imgNewPath .= '?x-oss-process=image/resize,m_fixed,h_' . $height . ',w_' . $width;
                break;
            default :
                break;
        }
        return $imgNewPath;
    }

    /**
     * 图片裁剪
     * @param $imgPath string 图片地址
     * @param $type string 背景色（png:透明背景，白色背景）
     * @param int $r int 半径
     * @return string
     */
    public function cutImg($imgPath, $type = 'png', $r = 100)
    {
        if ($type == 'png') {
            return $imgPath . '?x-oss-process=image/circle,r_' . $r . '/format,png';
        }
        return $imgPath . '?x-oss-process=image/circle,r_' . $r;
    }

}
